Identifying program source code from compiled machine code, i.e., binary, is a complex task. These complexities can arise because the binary representation obfuscates the original source code of the program. That is, binary machine code that is compiled from the original source code can be generated in several different ways according to implementations of a particular compiler to achieve similar functionalities, and thus directly reversing the binary into the exact original source code is generally difficult. This can be due to a lack of knowledge about the compiler that generated the binary, and, more generally, the overall complexity of the binary representation.
For example, in the context of maintaining security, it can be useful to reverse engineer a compromised binary or a binary of independent malicious code to unfold how a malicious attack compromised the program or how a particular piece of malicious code functions. However, attempting to reverse engineer binary code generally involves multiple steps that can include approximating the original source code from the binary code using imprecise tools, and then manually reconstructing the source code using the approximation as a base. This multiple step process can be tedious and often fails to provide a completely accurate reconstruction.